package com.ywd.platform.netty.jt080.po;

import lombok.Data;

import lombok.Data;

/**
 * JT808 终端鉴权消息体
 * 消息ID: 0x0102
 */
@Data
public class AuthBody {

    /**
     * 鉴权码长度 (1字节)
     * 表示鉴权码的字节长度
     */
    private int authCodeLength;

    /**
     * 鉴权码 (变长)
     * 终端注册时平台下发的鉴权码
     */
    private String authCode;

    /**
     * IMEI 号 (15字节，可选)
     * 终端IMEI号，BCD编码，不足15位前补0
     */
    private String imei;

    /**
     * 软件版本号 (20字节，可选)
     * 终端软件版本号，字符串，不足20位后补0
     */
    private String softwareVersion;

    /**
     * 获取鉴权码的字节长度
     * 使用GBK编码计算长度
     */
    public int calculateAuthCodeLength() {
        if (authCode == null || authCode.isEmpty()) {
            return 0;
        }
        try {
            return authCode.getBytes("GBK").length;
        } catch (Exception e) {
            return authCode.getBytes().length;
        }
    }

    /**
     * 获取消息体总长度
     */
    public int calculateBodyLength() {
        int length = 1; // 鉴权码长度字段占1字节

        // 鉴权码长度
        length += calculateAuthCodeLength();

        // IMEI号长度（如果存在）
        if (imei != null && !imei.isEmpty()) {
            length += 15; // IMEI固定15字节
        }

        // 软件版本号长度（如果存在）
        if (softwareVersion != null && !softwareVersion.isEmpty()) {
            length += 20; // 软件版本号固定20字节
        }

        return length;
    }

    /**
     * 验证IMEI号格式
     * IMEI号应为15位数字，BCD编码
     */
    public boolean validateImei() {
        if (imei == null || imei.isEmpty()) {
            return true; // IMEI是可选的，为空也视为有效
        }

        // 去除非数字字符
        String digitsOnly = imei.replaceAll("[^0-9]", "");

        // IMEI号应为15位数字
        return digitsOnly.length() == 15;
    }

    /**
     * 格式化IMEI号
     * 确保IMEI号为15位数字，不足15位前补0
     */
    public String formatImei() {
        if (imei == null || imei.isEmpty()) {
            return null;
        }

        // 去除非数字字符
        String digitsOnly = imei.replaceAll("[^0-9]", "");

        // 截断或补零
        if (digitsOnly.length() > 15) {
            return digitsOnly.substring(0, 15);
        } else if (digitsOnly.length() < 15) {
            return String.format("%15s", digitsOnly).replace(' ', '0');
        }

        return digitsOnly;
    }

    /**
     * 格式化软件版本号
     * 确保软件版本号为20字节，不足20字节后补0
     */
    public String formatSoftwareVersion() {
        if (softwareVersion == null || softwareVersion.isEmpty()) {
            return null;
        }

        // 截断或补零
        if (softwareVersion.length() > 20) {
            return softwareVersion.substring(0, 20);
        } else if (softwareVersion.length() < 20) {
            return String.format("%-20s", softwareVersion).replace(' ', '0');
        }

        return softwareVersion;
    }
}
